/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import logica.util.CSVHandler;
import logica.util.Perfil;
import logica.util.ProfilesUtil;
import logica.util.UtilNormalizacion;
import modelo.DTO.DTODataMining;
import modelo.DTO.DTOFactory;
import modelo.DTO.DTOListaDataMining;
import modelo.MoodleHelper;
import modelo.DTO.DTOPerfilAlumno;
import modelo.DTO.DTOPerfilUnicoAlumno;

/**
 * Es la clase que va a orquestar las peticiones de los servicios web
 * que tengan que ver con los alumnos del curso en este caso
 * se encargará de hacer las consultas a la base de datos
 * mediante las clases del modelo y lanzará las peticiones
 * a las clase de LogicaDataMining para lanzar el proyecto de
 * data mining
 *
 * @version 1.1
 * @author Ion B. Padilla
 */

public class LogicaAlumno {
    private LogicaDataMining dataMining;
    private MoodleHelper helper;
    private ArrayList<DTODataMining> usuarios;
    private int numeroCurso;
    private double etiquetasClusters[];
    private int noestaAlumno;
    /**
     * @param Las siguientes variables miembro sirven para guardar cada
     * atributo que consideramos en nuestro proyecto de data mining y el helper como
     * conexion con las base de datos
     */
    private DTOListaDataMining listaAtributos;
    /**
     * Constructor en el que se crea una lista de alumnos que son los que se van a mostrar como resultados del curso
     */
    public LogicaAlumno (){
        ProfilesUtil pUtil=ProfilesUtil.getInstance();
        numeroCurso=pUtil.getCurso();
        helper=MoodleHelper.getInstance();
        //ArrayList<DTODataMining> usuarios=(ArrayList<DTODataMining>) helper.getVisitasPorAlumnos();
        usuarios=(ArrayList<DTODataMining>) helper.getAlumnosPorCurso(numeroCurso);
    }

    public int noEstaAlumno(String nombre){

        int cont=0;
        noestaAlumno=0;
        ArrayList<String> lista = new ArrayList<String>();
        lista=helper.getAlumnosStringPorCursoLista(numeroCurso);

        for (int j=0;j<lista.size();j++){
            if (!(nombre.equals(lista.get(j))))
                cont++;
        }
        if (cont==lista.size()){
        cont=0;
        noestaAlumno=1;
        }
        return noestaAlumno;
    }

    /**
     * Consigue el perfil de un alumno
     * @param nombre El nombre del alumno del que se quiere
     *      saber el perfil 
     */
    public DTOPerfilAlumno getPerfilAlumno(String nombre,ProfilesUtil pUtil){
        DTODataMining usuario=(DTODataMining) helper.getAlumno(nombre);


        dataMining=new LogicaDataMining(usuarios);
        DTOFactory factoria=new DTOFactory();
        ArrayList <DTOPerfilUnicoAlumno> listaPerfiles = null;
        listaPerfiles=new ArrayList<DTOPerfilUnicoAlumno>();

        ArrayList <DTOPerfilUnicoAlumno> listaPerfilesNoEncontrado = null;
        listaPerfilesNoEncontrado=new ArrayList<DTOPerfilUnicoAlumno>();

        if (noestaAlumno==1){
           DTOPerfilUnicoAlumno perfilUnicoNoEncotrado = new DTOPerfilUnicoAlumno(nombre,0.0);
           listaPerfilesNoEncontrado.add(perfilUnicoNoEncotrado);
           return factoria.juntarPerfil(listaPerfilesNoEncontrado,nombre);
        }

        //


        Iterator iPUtil=pUtil.getIterator();
        while (iPUtil.hasNext()){
            dataMining=new LogicaDataMining(usuarios);
            Perfil perfil=(Perfil) iPUtil.next();
            helper=MoodleHelper.getInstance();
            this.crearPerfil(perfil);
            etiquetasClusters=dataMining.createCluster(perfil.size());
            listaPerfiles.add(dataMining.clasificateStudent(usuario,perfil,etiquetasClusters,usuarios));
        }

        return factoria.juntarPerfil(listaPerfiles,nombre);
    }

    /**
     * Devuelve la lista de alumnos cada uno con su perfil
     * @param pUtil le tenemos que pasar una lista de perfiles con sus registros correspondientes
     */

    public List<DTOPerfilAlumno> getPerfilesAlumnos(ProfilesUtil pUtil) {
        DTOFactory factoria=new DTOFactory();

        //lista donde iremos incluyendo cada lista de alumnos con cada perfil
        ArrayList<ArrayList <DTOPerfilUnicoAlumno>> listaPerfiles = null;
        listaPerfiles=new ArrayList<ArrayList <DTOPerfilUnicoAlumno>>();
        //creamos las clases de data mining segun el perfil que queremos generar
        Iterator iPUtil=pUtil.getIterator();
        while (iPUtil.hasNext()){
            dataMining=new LogicaDataMining(usuarios);
            Perfil perfil=(Perfil) iPUtil.next();
            this.crearPerfil(perfil);
            etiquetasClusters=dataMining.createCluster(perfil.size());
            listaPerfiles.add((ArrayList<DTOPerfilUnicoAlumno>) dataMining.clasificate(usuarios,perfil,etiquetasClusters));
        }
        return factoria.juntarPerfiles(listaPerfiles);
    }
    /**
     * Metodo que sirve para normalizar los datos, primero
     * nos aseguramos de que todas las listas de registros
     * tienen el mismo numero de alumnos y luego normalizamos
     * los resultados entre 1 y 2
     */
    private void normalizar (){
        //queremos el mismo numero de resultados en las consultas, así que generamos una solucion con el mismo numero de usuarios
        if(usuarios!=null){
            UtilNormalizacion norm=new UtilNormalizacion(listaAtributos);
            norm.normalizarResultado(usuarios);
            //añadimos cada atributo de la instancia
            int i=0;
            Iterator iteradorListaDM=norm.getListaDM().getIterator();
            //escribir la lista de atributos en un csv
            CSVHandler csv=new CSVHandler();
          //  csv.escrituraListaAtributos(norm.getListaDM());
          //  csv.escrituraListaNombres(norm.getListaDM());
            while(iteradorListaDM.hasNext()){
                i++;
                dataMining.addElement((ArrayList<DTODataMining>)iteradorListaDM.next(),"Atributo"+i);
            }
        }
    }
    /**
     * Metodo de debuggeo para imprimir por pantalla listas de registros
     * @param lista lista ha imprimir
     */
    private void listaDTMPantalla(DTOListaDataMining lista){
        Iterator iterLista=lista.getIterator();
        while(iterLista.hasNext()){
            ArrayList<DTODataMining> listaTmp=(ArrayList<DTODataMining>) iterLista.next();
            Iterator tmp=listaTmp.iterator();
            while(tmp.hasNext()){
                DTODataMining dtoTmp=(DTODataMining)tmp.next();
                System.out.println("Nombre: "+dtoTmp.getNombre()+" numero:"+dtoTmp.getCliks());
            }
            System.out.println("siguiente cosa \n\n");
        }
        System.out.println("");
    }
    /**
     * Metodo para añadir a la lista de atributos la lista de interacciones de cada alumnos
     * en el registro correspondiente
     * @param perfil perfil de aprendizaje
     */
    private void crearPerfil(Perfil perfil) {
        listaAtributos=new DTOListaDataMining();
            Iterator iPer=perfil.getRegIterator();
            while(iPer.hasNext()){
                String s=(String)iPer.next();
                //Paginas vistas
                if(s.equals("0"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getVisitasPorAlumnosPorCurso(numeroCurso));
                //Paginas únicas vistas
                if(s.equals("1"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getVisitasDifPorAlumnosPorCurso(numeroCurso));
                //Recursos
                if(s.equals("2"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getRecursosDifPorCursoAlumnos(numeroCurso));
                //Encuestas rellenadas
                if(s.equals("3"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getQuizPorStudentsPorCurso(numeroCurso));
                //Foro
                if(s.equals("4"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getForumPostedPorStudentsPorCurso(numeroCurso));
                //Secuencias
                if(s.equals("5"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getSecuencias(numeroCurso));
                //Archivos multimedia
                if(s.equals("6"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getTipoRecursosPorCurso(numeroCurso));
                //Entradas glosario
                if(s.equals("7"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getEntradasGlosarioPorStudentsPorCurso(numeroCurso));
                //Calificaciones glosario
                if(s.equals("8"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getCalificacionesGlosarioPorStudentsPorCurso(numeroCurso));
                //Actualizaciones glosario
                if(s.equals("9"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getActualizacionesGlosarioPorStudentsPorCurso(numeroCurso));
                //Comentarios glosario
                if(s.equals("10"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getCommentsGlosarioPorStudentsPorCurso(numeroCurso));
                //Chat
                if(s.equals("11"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getChatUsagePorStudentsPorCurso(numeroCurso));
                //Wiki
                if(s.equals("12"))
                    listaAtributos.add((ArrayList<DTODataMining>) helper.getEdicionWikiPorStudentsPorCurso(numeroCurso));
            }
            //sacar la lista de atributos por pantalla
            listaDTMPantalla(listaAtributos);

            this.normalizar();
    }

    private void dTMPantalla(ArrayList<DTODataMining> usuarios) {
        Iterator tmp=usuarios.iterator();
            while(tmp.hasNext()){
                DTODataMining dtoTmp=(DTODataMining)tmp.next();
                System.out.println("Nombre: "+dtoTmp.getNombre());
            }
    }

}
